From 894a0c0ff4560d9fb400b872d3170491786197f3 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 2 Jan 2018 23:52:24 -0500 Subject: [PATCH] font chooser: Add properties for features and language These can't be returned as part of the font description, so we need new api for them. For now, this is just readonly properties. Maybe these should be writable too, eventually. --- docs/reference/gtk/gtk4-sections.txt | 2 + gtk/gtkfontbutton.c | 28 ++++++++++- gtk/gtkfontchooser.c | 75 ++++++++++++++++++++++++++++ gtk/gtkfontchooser.h | 4 ++ gtk/gtkfontchooserutils.c | 6 +++ gtk/gtkfontchooserutils.h | 2 + gtk/gtkfontchooserwidget.c | 8 +++ 7 files changed, 123 insertions(+), 2 deletions(-) diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt index c3ba7f4df6..d0ab719b08 100644 --- a/docs/reference/gtk/gtk4-sections.txt +++ b/docs/reference/gtk/gtk4-sections.txt @@ -1305,6 +1305,8 @@ gtk_font_chooser_get_font gtk_font_chooser_set_font gtk_font_chooser_get_font_desc gtk_font_chooser_set_font_desc +gtk_font_chooser_get_font_features +gtk_font_chooser_get_font_language gtk_font_chooser_get_preview_text gtk_font_chooser_set_preview_text gtk_font_chooser_get_show_preview_entry diff --git a/gtk/gtkfontbutton.c b/gtk/gtkfontbutton.c index 739cba8923..6b7932a4a4 100644 --- a/gtk/gtkfontbutton.c +++ b/gtk/gtkfontbutton.c @@ -83,6 +83,8 @@ struct _GtkFontButtonPrivate PangoFontFace *font_face; PangoFontMap *font_map; gint font_size; + char *font_features; + char *language; gchar *preview_text; GtkFontFilterFunc font_filter; gpointer font_filter_data; @@ -159,6 +161,12 @@ clear_font_data (GtkFontButton *font_button) g_free (priv->fontname); priv->fontname = NULL; + + g_free (priv->font_features); + priv->font_features = NULL; + + g_free (priv->language); + priv->language = NULL; } static void @@ -699,6 +707,12 @@ gtk_font_button_get_property (GObject *object, case GTK_FONT_CHOOSER_PROP_FONT_DESC: g_value_set_boxed (value, gtk_font_button_get_font_desc (font_button)); break; + case GTK_FONT_CHOOSER_PROP_FONT_FEATURES: + g_value_set_string (value, priv->font_features); + break; + case GTK_FONT_CHOOSER_PROP_LANGUAGE: + g_value_set_string (value, priv->language); + break; case GTK_FONT_CHOOSER_PROP_LEVEL: g_value_set_enum (value, priv->level); break; @@ -1007,6 +1021,10 @@ response_cb (GtkDialog *dialog, if (priv->font_face) g_object_ref (priv->font_face); priv->font_size = gtk_font_chooser_get_font_size (font_chooser); + g_free (priv->font_features); + priv->font_features = gtk_font_chooser_get_font_features (font_chooser); + g_free (priv->language); + priv->language = gtk_font_chooser_get_language (font_chooser); /* Set label font */ gtk_font_button_update_font_info (font_button); @@ -1031,7 +1049,9 @@ dialog_destroy (GtkWidget *widget, } static gchar * -pango_font_description_to_css (PangoFontDescription *desc) +pango_font_description_to_css (PangoFontDescription *desc, + const char *features, + const char *language) { GString *s; PangoFontMask set; @@ -1153,6 +1173,10 @@ pango_font_description_to_css (PangoFontDescription *desc) { g_string_append_printf (s, "font-size: %dpt", pango_font_description_get_size (desc) / PANGO_SCALE); } + if (features) + { + g_string_append_printf (s, "font-feature-settings: %s;", features); + } g_string_append (s, "}"); @@ -1193,7 +1217,7 @@ gtk_font_button_label_use_font (GtkFontButton *font_button) if (!priv->use_size) pango_font_description_unset_fields (desc, PANGO_FONT_MASK_SIZE); - data = pango_font_description_to_css (desc); + data = pango_font_description_to_css (desc, priv->font_features, priv->language); gtk_css_provider_load_from_data (priv->provider, data, -1); g_free (data); diff --git a/gtk/gtkfontchooser.c b/gtk/gtkfontchooser.c index 41bb4b4a0e..5c1547d75b 100644 --- a/gtk/gtkfontchooser.c +++ b/gtk/gtkfontchooser.c @@ -121,6 +121,39 @@ gtk_font_chooser_default_init (GtkFontChooserInterface *iface) GTK_FONT_CHOOSER_LEVEL_FONT, GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY)); + /** + * GtkFontChooser:font-features: + * + * The selected font features, in a format that is compatible with + * CSS and with Pango attributes. + * + * Since: 3.94 + */ + g_object_interface_install_property + (iface, + g_param_spec_string ("font-features", + P_("Font features"), + P_("Font features as a string"), + "", + GTK_PARAM_READABLE)); + + /** + * GtkFontChooser:language: + * + * The language for which the #GtkFontChooser:font-features were + * selected, in a format that is compatible with CSS and with Pango + * attributes. + * + * Since: 3.94 + */ + g_object_interface_install_property + (iface, + g_param_spec_string ("language", + P_("Language"), + P_("Language for which features have been selected"), + "", + GTK_PARAM_READABLE)); + /** * GtkFontChooser::font-activated: * @self: the object which received the signal @@ -536,3 +569,45 @@ gtk_font_chooser_get_level (GtkFontChooser *fontchooser) return level; } + +/** + * gtk_font_chooser_get_font_features: + * @fontchooser: a #GtkFontChooser + * + * Gets the currently-selected font features. + * + * Returns: the currently selected font features + * Since: 3.94 + */ +char * +gtk_font_chooser_get_font_features (GtkFontChooser *fontchooser) +{ + char *text; + + g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), NULL); + + g_object_get (fontchooser, "font-features", &text, NULL); + + return text; +} + +/** + * gtk_font_chooser_get_language: + * @fontchooser: a #GtkFontChooser + * + * Gets the currently-selected language for font features. + * + * Returns: the currently selected language + * Since: 3.94 + */ +char * +gtk_font_chooser_get_language (GtkFontChooser *fontchooser) +{ + char *text; + + g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), NULL); + + g_object_get (fontchooser, "language", &text, NULL); + + return text; +} diff --git a/gtk/gtkfontchooser.h b/gtk/gtkfontchooser.h index b60d92a50a..18ca5d0b70 100644 --- a/gtk/gtkfontchooser.h +++ b/gtk/gtkfontchooser.h @@ -146,6 +146,10 @@ void gtk_font_chooser_set_level (GtkFontChooser *fo GDK_AVAILABLE_IN_3_94 GtkFontChooserLevel gtk_font_chooser_get_level (GtkFontChooser *fontchooser); +GDK_AVAILABLE_IN_3_94 +char * gtk_font_chooser_get_font_features (GtkFontChooser *fontchooser); +GDK_AVAILABLE_IN_3_94 +char * gtk_font_chooser_get_language (GtkFontChooser *fontchooser); G_END_DECLS diff --git a/gtk/gtkfontchooserutils.c b/gtk/gtkfontchooserutils.c index 09469bd3c9..84079d276d 100644 --- a/gtk/gtkfontchooserutils.c +++ b/gtk/gtkfontchooserutils.c @@ -137,6 +137,12 @@ _gtk_font_chooser_install_properties (GObjectClass *klass) g_object_class_override_property (klass, GTK_FONT_CHOOSER_PROP_LEVEL, "level"); + g_object_class_override_property (klass, + GTK_FONT_CHOOSER_PROP_FONT_FEATURES, + "font-features"); + g_object_class_override_property (klass, + GTK_FONT_CHOOSER_PROP_LANGUAGE, + "language"); } /** diff --git a/gtk/gtkfontchooserutils.h b/gtk/gtkfontchooserutils.h index 8d4af1bd66..ac7bf18558 100644 --- a/gtk/gtkfontchooserutils.h +++ b/gtk/gtkfontchooserutils.h @@ -38,6 +38,8 @@ typedef enum { GTK_FONT_CHOOSER_PROP_PREVIEW_TEXT, GTK_FONT_CHOOSER_PROP_SHOW_PREVIEW_ENTRY, GTK_FONT_CHOOSER_PROP_LEVEL, + GTK_FONT_CHOOSER_PROP_FONT_FEATURES, + GTK_FONT_CHOOSER_PROP_LANGUAGE, GTK_FONT_CHOOSER_PROP_LAST } GtkFontChooserProp; diff --git a/gtk/gtkfontchooserwidget.c b/gtk/gtkfontchooserwidget.c index ad1cbe7037..eb37bf84b3 100644 --- a/gtk/gtkfontchooserwidget.c +++ b/gtk/gtkfontchooserwidget.c @@ -330,6 +330,12 @@ gtk_font_chooser_widget_get_property (GObject *object, case GTK_FONT_CHOOSER_PROP_LEVEL: g_value_set_enum (value, gtk_font_chooser_widget_get_level (fontchooser)); break; + case GTK_FONT_CHOOSER_PROP_FONT_FEATURES: + g_value_set_string (value, fontchooser->priv->font_features); + break; + case GTK_FONT_CHOOSER_PROP_LANGUAGE: + g_value_set_string (value, pango_language_to_string (fontchooser->priv->font_language)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1863,6 +1869,7 @@ update_font_features (GtkFontChooserWidget *fontchooser) { g_free (priv->font_features); priv->font_features = g_string_free (s, FALSE); + g_object_notify (G_OBJECT (fontchooser), "font-features"); } else g_string_free (s, TRUE); @@ -1890,6 +1897,7 @@ update_language (GtkFontChooserWidget *fontchooser) if (priv->font_language != lang) { priv->font_language = lang; + g_object_notify (G_OBJECT (fontchooser), "language"); } } -- 2.30.2